home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Libraries / tk / tkvect3d.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  2.7 KB  |  187 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #include "glu.h"
  6. #include "3d.h"
  7.  
  8. void (*errfunc)(char *) = 0;
  9.  
  10. void seterrorfunc(void (*func)(char *))
  11. {
  12.     errfunc = func;
  13. }
  14.  
  15. void error(char *s)
  16. {
  17.     if(errfunc)
  18.     {
  19.         (*errfunc)(s);
  20.     }
  21.     else
  22.     {
  23.         fprintf(stderr, s); 
  24.         fprintf(stderr, "\n");
  25.         exit(1);
  26.     }
  27. }
  28.  
  29. void diff3(GLdouble p[3], GLdouble q[3], GLdouble diff[3])
  30. {
  31.     diff[0] = p[0] - q[0];
  32.     diff[1] = p[1] - q[1];
  33.     diff[2] = p[2] - q[2];
  34. }
  35.  
  36. void add3(GLdouble p[3], GLdouble q[3], GLdouble sum[3])
  37. {
  38.     sum[0] = p[0] + q[0];
  39.     sum[1] = p[1] + q[1];
  40.     sum[2] = p[2] + q[2];
  41. }
  42.  
  43. void scalarmult(GLdouble s, GLdouble v[3], GLdouble vout[3])
  44. {
  45.     vout[0] = v[0] * s;
  46.     vout[1] = v[1] * s;
  47.     vout[2] = v[2] * s;
  48. }
  49.  
  50. GLdouble dot3(GLdouble p[3], GLdouble q[3])
  51. {
  52.     return (p[0] * q[0] + p[1] * q[1] + p[2] * q[2]);
  53. }
  54.  
  55. GLdouble length3(GLdouble v[3])
  56. {
  57.     return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
  58. }
  59.  
  60. GLdouble dist3(GLdouble p[3], GLdouble q[3])
  61. {
  62.     GLdouble d[3];
  63.  
  64.     diff3(p, q, d);
  65.     
  66.     return length3(d);
  67. }
  68.  
  69. void copy3(GLdouble o[3], GLdouble n[3])
  70. {
  71.     n[0] = o[0];
  72.     n[1] = o[1];
  73.     n[2] = o[2];
  74. }
  75.  
  76. void crossprod(GLdouble v1[3], GLdouble v2[3], GLdouble prod[3])
  77. {
  78.     GLdouble p[3];    /* in case prod == v1 or v2 */
  79.  
  80.     p[0] = v1[1]*v2[2] - v2[1]*v1[2];
  81.     p[1] = v1[2]*v2[0] - v2[2]*v1[0];
  82.     p[2] = v1[0]*v2[1] - v2[0]*v1[1];
  83.     
  84.     prod[0] = p[0];
  85.     prod[1] = p[1]; 
  86.     prod[2] = p[2];
  87. }
  88.  
  89. void normalize(GLdouble v[3])
  90. {
  91.     GLdouble d;
  92.  
  93.     d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
  94.     
  95.     if (d == 0.0)
  96.     {
  97.         error("normalize: zero length vector");
  98.         v[0] = d = 1.0;
  99.     }
  100.     
  101.     d = 1/d;
  102.     
  103.     v[0] *= d;
  104.     v[1] *= d;
  105.     v[2] *= d;
  106. }
  107.  
  108. void print3(GLdouble v[3])
  109. {
  110.     GLdouble len;
  111.  
  112.     len = length3(v);
  113.     printf("(%g %g %g); len: %g\n", v[0], v[1], v[2], len);
  114. }
  115.  
  116. void printmat3(GLdouble m[3][3])
  117. {
  118.     int i, j;
  119.  
  120.     for (i=0; i<3; i++)
  121.     {
  122.         for (j=0; j<3; j++)
  123.         {
  124.             printf("%7.4f  ", m[i][j]);
  125.         }
  126.         
  127.         printf("\n");
  128.     }
  129. }
  130.  
  131. void identifymat3(GLdouble m[3][3])
  132. {
  133.     int i, j;
  134.  
  135.     for (i=0; i<3; i++)
  136.     {
  137.         for (j=0; j<3; j++)
  138.         {
  139.             m[i][j] = (i == j) ? 1.0 : 0.0;
  140.         }
  141.     }
  142. }
  143.  
  144. void copymat3(GLdouble *to, GLdouble *from)
  145. {
  146.     int i;
  147.  
  148.     for (i=0; i<9; i++)
  149.     {
  150.         *to++ = *from++;
  151.     }
  152. }
  153.  
  154. void xformvec3(GLdouble v[3], GLdouble m[3][3], GLdouble vm[3])
  155. {
  156.     GLdouble result[3];    /* in case v == vm */
  157.     int i;
  158.  
  159.     for(i = 0; i < 3; i++)
  160.     {
  161.         result[i] = v[0]*m[0][i] + v[1]*m[1][i] + v[2]*m[2][i];
  162.     }
  163.     
  164.     for(i = 0; i < 3; i++)
  165.     {
  166.         vm[i] = result[i];
  167.     }
  168. }
  169.  
  170. long samepoint(GLdouble p1[3], GLdouble p2[3])
  171. {
  172.     if (p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2])
  173.     return 1;
  174.     return 0;
  175. }
  176.  
  177. void perpnorm(GLdouble p1[3], GLdouble p2[3], GLdouble p3[3], GLdouble n[3])
  178. {
  179.     GLdouble d1[3], d2[3];
  180.  
  181.     diff3(p2, p1, d1);
  182.     diff3(p2, p3, d2);
  183.     crossprod(d1, d2, n);
  184.     normalize(n);
  185. }
  186.  
  187.